iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

我們與Maven的距離系列 第 22

Day21 - JAR Packaging:Distribution ZIP

  • 分享至 

  • xImage
  •  

前言

對於軟體打包的應用distribution zip是很常見的方式,解壓縮後完整的軟體內容就包含在其中,可以從bin目錄下啟動相關應用,設定好環境變數更可以讓作業系統找到指令執行,例如java、maven、h2 database、jboss、tomcat等等,就讓我們來看看要怎麼將我們的專案做一個ZIP打包

ZIP structure

以maven這個軟體來說,解壓縮後的資料夾結構會長下面這個樣子
https://ithelp.ithome.com.tw/upload/images/20251006/20128084iyPlCmDlKW.png
以h2 database資料庫會長下面這個樣子
https://ithelp.ithome.com.tw/upload/images/20251006/20128084IRZP25fBmy.png

範例演示 - maven-assembly-plugin

這邊的專案延續Day5的專案再做修改,使用maven-assembly-plugin這個套件進行ZIP打包,它需要一下配置發佈的xml設定檔,另外搬JAR的工作就交給maven-dependency-plugin這個套件

資料夾規劃

myapp
+---bin     (sh與bat存放位置)
+---conf    (logback設定檔路徑)
+---lib     (依賴套件與主程式jar檔)
\---logs    (預計程式執行後生成log檔路徑)

pom.xml設定配置

<plugins>
  <!-- Maven Dependency Plugin for copying dependencies -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.6.1</version>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${project.build.directory}/dependency</outputDirectory>
          <overWriteReleases>false</overWriteReleases>
          <overWriteSnapshots>false</overWriteSnapshots>
          <overWriteIfNewer>true</overWriteIfNewer>
        </configuration>
      </execution>
    </executions>
  </plugin>

  <!-- Maven Assembly Plugin for creating distribution ZIP -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.7.1</version>
    <configuration>
      <descriptors>
        <descriptor>src/assembly/distribution.xml</descriptor>
      </descriptors>
      <finalName>${project.artifactId}-${project.version}</finalName>
      <appendAssemblyId>true</appendAssemblyId>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

assembly-plugin配置distribution.xml

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.2.0
          http://maven.apache.org/xsd/assembly-2.2.0.xsd">

  <id>distribution</id>

  <formats>
    <format>zip</format>
  </formats>

  <includeBaseDirectory>true</includeBaseDirectory>

  <fileSets>
    <!-- Include the main JAR file -->
    <fileSet>
      <directory>${project.build.directory}</directory>
      <outputDirectory>/bin</outputDirectory>
      <includes>
        <include>${project.build.finalName}.jar</include>
      </includes>
    </fileSet>

    <!-- Include all dependencies (excluding test scope) -->
    <fileSet>
      <directory>${project.build.directory}/dependency</directory>
      <outputDirectory>/lib</outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
      <excludes>
        <exclude>junit-*.jar</exclude>
        <exclude>apiguardian-*.jar</exclude>
        <exclude>opentest4j-*.jar</exclude>
      </excludes>
    </fileSet>

    <!-- Include configuration files from src/main/resources -->
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>/conf</outputDirectory>
      <includes>
        <include>**/*</include>
      </includes>
    </fileSet>

    <!-- Include documentation -->
    <fileSet>
      <directory>.</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>README.md</include>
        <include>LICENSE</include>
        <include>*.txt</include>
      </includes>
    </fileSet>

    <!-- Include launcher scripts -->
    <fileSet>
      <directory>src/assembly</directory>
      <outputDirectory>/bin</outputDirectory>
      <includes>
        <include>run.bat</include>
        <include>run.sh</include>
      </includes>
      <fileMode>0755</fileMode>
    </fileSet>

  </fileSets>
</assembly>

執行結果
https://ithelp.ithome.com.tw/upload/images/20251006/20128084ioNFKkcEYe.png

程式執行後路徑

my-app-1.0-SNAPSHOT
|   README.md
|
+---bin
|       run.bat
|       run.sh
|       MyApp.jar
|
+---conf
|       application.properties
|       logback.xml
|
+---lib
|       logback-classic-1.5.18.jar
|       logback-core-1.5.18.jar
|       slf4j-api-2.0.17.jar
|
\---logs
        MyApp-error.log
        MyApp.log

小結

我們maven-assembly-plugin幫我們達到打包發佈Distribution ZIP,有AI的幫助一切真變得更簡單了XD,要注意的是h2 database把主程式放在bin路徑下,而maven主程式則放在boot資料夾下,就看個人怎麼規劃了

Reference


上一篇
Day20 - JAR Packaging:Uber / Fat JAR
下一篇
Day22 - JAR Packaging:Native
系列文
我們與Maven的距離24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言